package com.mouliu.base.concurrent18;

import java.util.concurrent.*;

/**
 * @author mouliu
 * @create 2018-04-15-下午9:09
 */
public class UseFuture implements Callable<String> {
    private String para;

    public UseFuture(String para){
        this.para = para;
    }
    /**
     * 这里是真实的业务逻辑，其执行可能很慢
     */

    @Override
    public String call() throws Exception {
        //模拟执行耗时
        Thread.sleep(5000);
        String result =
                this.para +"处理完成";
        return result;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        String querysTr = "query";
        //构造FutureTask，并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类
        FutureTask<String>futureTask = new FutureTask<>(new UseFuture(querysTr));
        FutureTask<String>futureTask2 = new FutureTask<>(new UseFuture(querysTr));
        //创建一个固定线程的线程池且线程数为1
        ExecutorService executorService =
                Executors.newFixedThreadPool(2);
        //这里提交任务future,则开启线程执行RealData的call()方法执行
        //submit和execute的区别： 第一点是submit可以传入实现Callable接口的实例对象， 第二点是submit方法有返回值
        Future f1 =  executorService.submit(futureTask);
        Future f2 = executorService.submit(futureTask2);
        System.out.println("请求完成");

        try {
            //这里可以做额外的数据操作，也就是主程序执行其他业务逻辑
            System.out.println("处理实际的业务逻辑...");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //调用获取数据方法，如果call()方法没有执行完成，则依然会进行等等
        System.out.println("数据:"+futureTask.get());
        System.out.println("数据:"+futureTask2.get());

        executorService.shutdown();
    }
}
